#include <string>
#include "node.h"
#include "declarationvariable.h"

namespace AST {

    // Construtor
    DeclarationVariable::DeclarationVariable(std::string* identifier) {
        // Configuração
        this->_setIdentifier(identifier);
    };

    // Construtor Especializado
    DeclarationVariable::DeclarationVariable(std::string* identifier, Node* type) {
        // Configuração
        this->_setIdentifier(identifier)->setType(type);
    };

    // Configura o Identificador da Variável
    DeclarationVariable* DeclarationVariable::_setIdentifier(std::string* identifier) {
        // Configuração
        this->_identifier = identifier;
        // Encadeamento
        return this;
    };

    // Apresenta o Identificador da Variável
    std::string* DeclarationVariable::getIdentifier() {
        // Apresentação
        return this->_identifier;
    };

    // Configuração do Tipo de Dado
    DeclarationVariable* DeclarationVariable::setType(Node* type) {
        // Configuração
        this->_type = type;
        // Encadeamento
        return this;
    };

    // Apresenta o Tipo de Dado Definido
    Node* DeclarationVariable::getType() {
        // Apresentação
        return this->_type;
    };

    // Sobrescrita
    std::string DeclarationVariable::toString(int indent) {
        // Apresentação
        return this->getIndentSpaces(indent)
            + "Declaration\n"
            + this->getIndentSpaces(indent + 1) + "Identifier '" + (*this->getIdentifier()) + "'\n"
            + this->getType()->toString(indent + 1);
    };

};

